Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

43장. ECR — 컨테이너 이미지 저장소

이 장에서 말하고자 하는 것

이미지를 빌드했다면 다음 문제가 생긴다.

“이 이미지를 ECS / EKS / EC2 가 어떻게 받아가지?”

이때 등장하는 게

Amazon ECR (Elastic Container Registry)

다.

ECR은 AWS가 운영하는 컨테이너 이미지 저장소다.


1. ECR이 하는 일

  • 이미지를 안전하게 저장 (프라이빗 기본)
  • IAM으로 접근 통제
  • 취약점 자동 스캔
  • ECS · EKS · Lambda 와 매끄럽게 연동

Docker Hub와 비슷한 자리지만
AWS 내부에 두니 권한 · 속도 · 비용이 좋다.


2. 리포지토리 = 한 종류의 이미지

orders 리포지토리
  ├─ orders:v1
  ├─ orders:v2
  └─ orders:sha-a3f2c1

서비스마다 리포지토리 하나가 일반적이다.


3. 이미지 태그 — 운영 규칙

좋은 태그

  • 시맨틱 버전: v1.2.3
  • 커밋 해시: sha-a3f2c1
  • 빌드 번호: build-145

피해야 할 태그

  • latest — 내용이 자꾸 바뀐다
  • prod — 어디서 만들어졌는지 모른다

태그는 불변(immutable) 으로 — 한 번 푸시한 태그는 덮어쓰지 않는다

ECR은 imageTagMutability = IMMUTABLE 로 설정할 수 있다.


4. 인증과 푸시

aws ecr get-login-password --region ap-northeast-2 \
  | docker login --username AWS \
                 --password-stdin <acct>.dkr.ecr.ap-northeast-2.amazonaws.com

docker tag orders:v1 <acct>.dkr.ecr.ap-northeast-2.amazonaws.com/orders:v1
docker push <acct>.dkr.ecr.ap-northeast-2.amazonaws.com/orders:v1

ECS가 그 이미지를 받을 때는
Task Execution Role 에 ECR pull 권한이 필요하다.


5. 이미지 스캔

  • Basic Scan — 알려진 CVE 매칭 (무료)
  • Enhanced Scan — Inspector 기반 깊은 스캔 (유료)
스캔 결과: CRITICAL 1, HIGH 3, MEDIUM 12

CRITICAL 등급 이상은 알람 또는 배포 차단으로 연결한다.

운영 이미지는 무조건 스캔 결과를 본다


6. 수명 주기 정책

오래된 이미지를 자동 정리한다.

규칙 1: 태그 없는 이미지 7일 후 삭제
규칙 2: 최근 30개만 유지

ECR 비용의 절반은 “안 쓰는 옛 이미지” 다.


7. 우리 서비스에서

[개발자 또는 CI]
   ↓ docker push
[ECR: orders / users / payments]
   ↑ docker pull (Task Execution Role)
[ECS Service Task]
  • 서비스마다 리포지토리 하나
  • 태그는 커밋 해시 (불변)
  • CRITICAL 취약점은 배포 전 차단
  • 수명 주기로 자동 정리

8. 직접 확인해보기 — CLI

aws ecr create-repository \
  --repository-name orders \
  --image-scanning-configuration scanOnPush=true \
  --image-tag-mutability IMMUTABLE

aws ecr list-images --repository-name orders

aws ecr describe-image-scan-findings \
  --repository-name orders \
  --image-id imageTag=v1

9. 코드로는 이렇게 생겼다 — Terraform

resource "aws_ecr_repository" "orders" {
  name                 = "orders"
  image_tag_mutability = "IMMUTABLE"

  image_scanning_configuration {
    scan_on_push = true
  }

  encryption_configuration {
    encryption_type = "AES256"
  }
}

resource "aws_ecr_lifecycle_policy" "orders" {
  repository = aws_ecr_repository.orders.name

  policy = jsonencode({
    rules = [
      {
        rulePriority = 1
        description  = "untagged 7일 후 삭제"
        selection = {
          tagStatus   = "untagged"
          countType   = "sinceImagePushed"
          countUnit   = "days"
          countNumber = 7
        }
        action = { type = "expire" }
      },
      {
        rulePriority = 2
        description  = "최근 30개만 유지"
        selection = {
          tagStatus   = "any"
          countType   = "imageCountMoreThan"
          countNumber = 30
        }
        action = { type = "expire" }
      }
    ]
  })
}

10. 이렇게 쓰면 망한다 — 안티패턴

안티패턴 1. latest 태그로 운영한다

롤백 불가능.

안티패턴 2. 수명 주기를 안 건다

청구서가 매달 늘어난다.

안티패턴 3. 스캔 결과를 안 본다

CRITICAL CVE가 운영 이미지에 있는데 모른다.

안티패턴 4. 권한 없는 사용자에게 push 권한을 준다

이미지가 곧 운영 코드다. push 권한은 CI/일부 인력으로 제한.


11. 한 줄로 정리

ECR은 AWS 안의 컨테이너 이미지 저장소이며,
불변 태그 · 스캔 · 수명 주기 세 가지가 운영의 기본이다


12. 이 장의 핵심 정리

  1. ECR은 AWS의 관리형 컨테이너 이미지 저장소다.
  2. 서비스마다 리포지토리 하나가 표준이다.
  3. 태그는 불변으로 운영해야 롤백이 가능하다.
  4. 스캔 결과를 알람으로 받고, CRITICAL은 배포에서 차단한다.
  5. 수명 주기 정책으로 오래된 이미지를 자동 정리한다.
  6. ECS의 Task Execution Role이 이미지를 pull 한다.